package com.yaorange.nongjt.service.impl;

import java.util.List;

import com.yaorange.common.core.domain.AjaxResult;
import com.yaorange.common.utils.DateUtils;
import com.yaorange.nongjt.domain.NjtLoginUser;
import com.yaorange.nongjt.domain.NjtSerial;
import com.yaorange.nongjt.dto.NjtSerialAuthDto;
import com.yaorange.nongjt.dto.SerialAuthDto;
import com.yaorange.nongjt.mapper.NjtSerialMapper;
import com.yaorange.nongjt.vo.NjtSerialAuthVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.yaorange.nongjt.mapper.NjtSerialAuthMapper;
import com.yaorange.nongjt.domain.NjtSerialAuth;
import com.yaorange.nongjt.service.INjtSerialAuthService;

/**
 * 打印机序列号认证情况Service业务层处理
 * 
 * @author juheng
 * @date 2025-02-28
 */
@Service
public class NjtSerialAuthServiceImpl implements INjtSerialAuthService 
{
    @Autowired
    private NjtSerialAuthMapper njtSerialAuthMapper;
    @Autowired
    private NjtSerialMapper njtSerialMapper;
    @Autowired
    private NjtCommonService commonService;

    /**
     * 查询打印机序列号认证情况
     * 
     * @param id 打印机序列号认证情况主键
     * @return 打印机序列号认证情况
     */
    @Override
    public NjtSerialAuth selectNjtSerialAuthById(Long id)
    {
        return njtSerialAuthMapper.selectNjtSerialAuthById(id);
    }

    /**
     * 查询打印机序列号认证情况列表
     * 
     * @param njtSerialAuthDto 打印机序列号认证情况
     * @return 打印机序列号认证情况
     */
    @Override
    public List<NjtSerialAuthVo> selectNjtSerialAuthList(NjtSerialAuthDto njtSerialAuthDto)
    {
        return njtSerialAuthMapper.selectNjtSerialAuthList(njtSerialAuthDto);
    }

    /**
     * 新增打印机序列号认证情况
     * 
     * @param njtSerialAuth 打印机序列号认证情况
     * @return 结果
     */
    @Override
    public int insertNjtSerialAuth(NjtSerialAuth njtSerialAuth)
    {
        njtSerialAuth.setCreateTime(DateUtils.getNowDate());
        return njtSerialAuthMapper.insertNjtSerialAuth(njtSerialAuth);
    }

    /**
     * 修改打印机序列号认证情况
     * 
     * @param njtSerialAuth 打印机序列号认证情况
     * @return 结果
     */
    @Override
    public int updateNjtSerialAuth(NjtSerialAuth njtSerialAuth)
    {
        njtSerialAuth.setUpdateTime(DateUtils.getNowDate());
        njtSerialAuthMapper.updateNjtSerialAuth(njtSerialAuth);

        NjtSerial njtSerial = new NjtSerial();
        njtSerial.setSerialCode(njtSerialAuth.getSerialCode());
        njtSerial.setUseFlag(Integer.parseInt(njtSerialAuth.getStatus().toString()));
        njtSerial.setUpdateTime(njtSerialAuth.getUpdateTime());
        njtSerialMapper.updateNjtSerialBySerialCode(njtSerial);
        return 1;
    }

    /**
     * 批量删除打印机序列号认证情况
     * 
     * @param ids 需要删除的打印机序列号认证情况主键
     * @return 结果
     */
    @Override
    public int deleteNjtSerialAuthByIds(Long[] ids)
    {
        return njtSerialAuthMapper.deleteNjtSerialAuthByIds(ids);
    }

    /**
     * 删除打印机序列号认证情况信息
     * 
     * @param id 打印机序列号认证情况主键
     * @return 结果
     */
    @Override
    public int deleteNjtSerialAuthById(Long id)
    {
        return njtSerialAuthMapper.deleteNjtSerialAuthById(id);
    }

    /**
     * 通过序列号查询
     *
     * @param serialCode 序列号
     * @return
     */
    @Override
    public NjtSerialAuthVo getBySerialCode(String serialCode) {
        NjtSerialAuthDto njtSerialAuth = new NjtSerialAuthDto();
        njtSerialAuth.setSerialCode(serialCode);
        List<NjtSerialAuthVo> serialAuthList = this.selectNjtSerialAuthList(njtSerialAuth);
        if (null != serialAuthList && !serialAuthList.isEmpty()) {
            return serialAuthList.get(0);
        }
        return null;
    }

    @Override
    public List<SerialAuthDto> getSerialAuthList() {
        NjtLoginUser loginUser = commonService.getLoginUser();
        return njtSerialAuthMapper.getSerialAuthList(loginUser.getUserPerfect().getUserId());
    }

    @Override
    public List<SerialAuthDto> querySerialNoFlagList() {
        return njtSerialAuthMapper.querySerialNoFlagList();
    }

    @Override
    public AjaxResult executeAuth(String serialCode, String macCode) {
        // 1. 检查用户是否是会员
        NjtLoginUser loginUser = commonService.getLoginUser();
        if (loginUser.getUserRegister() == null) {
            return AjaxResult.error("非会员无法进行认证");
        }
        // 2. 查询序列号信息
        NjtSerial serial = njtSerialMapper.selectBySerialCode(serialCode);
        if (serial == null) {
            return AjaxResult.error("非法序列号，请重新扫描");
        }
        // 3. 检查序列号是否已使用
        if (serial.getUseFlag() == null || serial.getUseFlag() == 0) {
            // 序列号未使用，认证并更新状态
            this.authAndBind(serialCode, macCode, loginUser.getUserPerfect().getUserId());
        } else {
            return AjaxResult.error("该打印机已被其他用户绑定，请重新选择");
        }
        return AjaxResult.success("认证成功");
    }
    private void authAndBind(String serialCode, String macCode, Long userId) {
        // 1. 更新序列号状态为已使用
        njtSerialMapper.updateUseFlag(serialCode, Boolean.TRUE);
        // 2. 新增认证信息
        NjtSerialAuth auth = new NjtSerialAuth();
        auth.setUserId(userId);
        auth.setSerialCode(serialCode);
        auth.setMacCode(macCode);
        auth.setAuthStatus("1");
        auth.setStatus(1);
        njtSerialAuthMapper.insertNjtSerialAuth(auth);
    }
}
